ã·ãŒã ã¬ã¹ãªããã³ããšã³ãã®ãªã¢ã«ã¿ã€ã ã³ã©ãã¬ãŒã·ã§ã³ãå®çŸãããªãã¬ãŒã·ã§ãã«ãã©ã³ã¹ãã©ãŒã¡ãŒã·ã§ã³å®è£ ã®è€éããæ¢æ±ããã°ããŒãã«ãªãŠãŒã¶ãŒäœéšãåäžãããŸãã
ããã³ããšã³ããªã¢ã«ã¿ã€ã ã³ã©ãã¬ãŒã·ã§ã³ïŒãªãã¬ãŒã·ã§ãã«ãã©ã³ã¹ãã©ãŒã¡ãŒã·ã§ã³ããã¹ã¿ãŒãã
仿¥ã®çžäºæ¥ç¶ãããããžã¿ã«ç°å¢ã«ãããŠãWebã¢ããªã±ãŒã·ã§ã³ã«ãããã·ãŒã ã¬ã¹ãªãªã¢ã«ã¿ã€ã ã³ã©ãã¬ãŒã·ã§ã³äœéšãžã®èŠæ±ã¯ãã€ãŠãªãã»ã©é«ãŸã£ãŠããŸããããã¥ã¡ã³ãã®å ±åç·šéãã€ã³ã¿ãŒãã§ãŒã¹ã®å ±åãã¶ã€ã³ãå ±æãããžã§ã¯ãããŒãã®ç®¡çãªã©ããŠãŒã¶ãŒã¯å°ççãªå Žæã«é¢ãããã倿Žãå³åº§ã«åæ ãããããšãæåŸ ããŠããŸãããã®é«åºŠãªã¬ãã«ã®ã€ã³ã¿ã©ã¯ãã£ããã£ãå®çŸããã«ã¯ãç¹ã«ããã³ããšã³ãã«ãããŠãéå€§ãªæè¡ç課é¡ã䌎ããŸããæ¬çš¿ã§ã¯ãå ç¢ãªãªã¢ã«ã¿ã€ã ã³ã©ãã¬ãŒã·ã§ã³ãå¯èœã«ãã匷åãªæè¡ã§ãããªãã¬ãŒã·ã§ãã«ãã©ã³ã¹ãã©ãŒã¡ãŒã·ã§ã³ïŒOTïŒã®èåŸã«ããäžå¿çãªæŠå¿µãšå®è£ æŠç¥ã«ã€ããŠæãäžããŸãã
åæç·šéã®èª²é¡
è€æ°ã®ãŠãŒã¶ãŒãåæã«åãããã¹ããå ±æãã¶ã€ã³èŠçŽ ãç·šéããŠããç¶æ³ãæ³åããŠã¿ãŠãã ããããããã®åææäœãåŠçããããã®é«åºŠãªã¡ã«ããºã ããªããã°ãäžæŽåãããŒã¿æå€±ã¯ã»ãŒé¿ããããŸããããŠãŒã¶ãŒAãã€ã³ããã¯ã¹5ã®æåãåé€ããåæã«ãŠãŒã¶ãŒBãã€ã³ããã¯ã¹7ã«æåãæ¿å ¥ããå Žåãã·ã¹ãã ã¯ãããã®ã¢ã¯ã·ã§ã³ãã©ã®ããã«èª¿æŽãã¹ãã§ããããïŒãããOTã解決ãç®æãæ ¹æ¬çãªåé¡ã§ãã
倿Žãé æ¬¡é©çšãããåŸæ¥ã®ã¯ã©ã€ã¢ã³ããµãŒããŒã¢ãã«ã¯ããªã¢ã«ã¿ã€ã ã®å ±åäœæ¥ç°å¢ã§ã¯ããŸãæ©èœããŸãããåã¯ã©ã€ã¢ã³ãã¯ç¬ç«ããŠåäœããäžå€®ãµãŒããŒã«éä¿¡ãããŠããä»ã®ãã¹ãŠã®ã¯ã©ã€ã¢ã³ãã«äŒæãããå¿ èŠãããæäœãçæããŸãããããã®æäœãç°ãªãã¯ã©ã€ã¢ã³ãã«å°çããé åºã¯æ§ã ã§ãããé©åã«åŠçãããªããšç¶æ ã®ç«¶åã«ã€ãªããå¯èœæ§ããããŸãã
ãªãã¬ãŒã·ã§ãã«ãã©ã³ã¹ãã©ãŒã¡ãŒã·ã§ã³ãšã¯ïŒ
ãªãã¬ãŒã·ã§ãã«ãã©ã³ã¹ãã©ãŒã¡ãŒã·ã§ã³ã¯ãå ±æããŒã¿æ§é ã«å¯Ÿããåææäœããç¬ç«ããŠããã€é äžåã§çæãããå Žåã§ãããã¹ãŠã®ã¬ããªã«ã§äžè²«ããé åºã§é©çšãããããšãä¿èšŒããããã«äœ¿çšãããã¢ã«ãŽãªãºã ã§ããããã¯ã以åã«å®è¡ãããæäœã«åºã¥ããŠæäœã倿ããããšã«ãã£ãŠæ©èœããããã«ãã£ãŠåææ§ãã€ãŸããã¹ãŠã®ã¬ããªã«ãæçµçã«åãç¶æ ã«å°éãããšããä¿èšŒãç¶æããŸãã
OTã®äžå¿çãªã¢ã€ãã¢ã¯ãäžé£ã®å€æé¢æ°ãå®çŸ©ããããšã§ããæäœOpBãããã§ã«æäœOpAãé©çšããã¯ã©ã€ã¢ã³ãã«å°çããOpBãã¯ã©ã€ã¢ã³ãã«OpAãç¥ãããåã«çæãããå ŽåãOTã¯ãOpBãé©çšããããšãã«OpAã®åã«é©çšãããå Žåãšåã广ãéæããããã«ãOpBãOpAã«å¯ŸããŠã©ã®ããã«å€æãã¹ãããå®çŸ©ããŸãã
OTã«ãããäž»èŠæŠå¿µ
- æäœïŒOperationsïŒïŒ ãããã¯å ±æããŒã¿ã«é©çšããã倿Žã®åºæ¬åäœã§ããããã¹ãç·šéã®å Žåãæäœã¯æ¿å ¥ïŒæåãäœçœ®ïŒãŸãã¯åé€ïŒäœçœ®ãæåæ°ïŒã«ãªããŸãã
- ã¬ããªã«ïŒReplicasïŒïŒ åãŠãŒã¶ãŒã®å ±æããŒã¿ã®ããŒã«ã«ã³ããŒã¯ã¬ããªã«ãšèŠãªãããŸãã
- åææ§ïŒConvergenceïŒïŒ æäœãåä¿¡ããé©çšãããé åºã«é¢ä¿ãªãããã¹ãŠã®ã¬ããªã«ãæçµçã«åãç¶æ ã«å°éãããšããç¹æ§ã§ãã
- 倿颿°ïŒTransformation FunctionsïŒïŒ OTã®å¿èéšã§ããããããã®é¢æ°ã¯ãäžè²«æ§ãç¶æããããã«å è¡ããæäœã«åºã¥ããŠåä¿¡ããæäœã調æŽããŸãã2ã€ã®æäœOpAãšOpBã«ã€ããŠã次ã®ããã«å®çŸ©ããŸãã
- OpA' = OpA.transform(OpB): OpAãOpBã«å¯ŸããŠå€æããŸãã
- OpB' = OpB.transform(OpA): OpBãOpAã«å¯ŸããŠå€æããŸãã
- å æé¢ä¿ïŒCausalityïŒïŒ æäœéã®äŸåé¢ä¿ãçè§£ããããšã¯éåžžã«éèŠã§ããOpBãOpAã«å æçã«äŸåããŠããå ŽåïŒã€ãŸããOpBãOpAã®åŸã«çæãããå ŽåïŒããã®é åºã¯éåžžç¶æãããŸãããã ããOTã¯äž»ã«æäœãåæã§ããå Žåã®ç«¶å解決ã«é¢å¿ããããŸãã
OTã®ä»çµã¿ïŒç°¡åãªäŸ
ã¢ãªã¹ãšããã®2人ã®ãŠãŒã¶ãŒããæåã«ãHelloããšããå 容ã®ããã¥ã¡ã³ããç·šéããç°¡åãªããã¹ãç·šéã·ããªãªãèããŠã¿ãŸãããã
åæç¶æ ïŒ "Hello"
ã·ããªãªïŒ
- ã¢ãªã¹ã¯äœçœ®5ã«ã ããæ¿å ¥ããããæäœOpAïŒ insert(' ', 5)ã
- ããã¯äœçœ®6ã«ã!ããæ¿å ¥ããããæäœOpBïŒ insert('!', 6)ã
ãããã®æäœãã»ãŒåæã«çæãããã¢ãªã¹ã®ã¯ã©ã€ã¢ã³ããOpAãåŠçããåã«ããã®ã¯ã©ã€ã¢ã³ãã«å°éããã¢ãªã¹ã®ã¯ã©ã€ã¢ã³ãã¯OpAãåãåãåã«OpBãåŠçãããšä»®å®ããŸãã
ã¢ãªã¹åŽïŒ
- OpBãåä¿¡ïŒ insert('!', 6)ãããã¥ã¡ã³ãã¯ãHello!ãã«ãªããŸãã
- OpAãåä¿¡ïŒ insert(' ', 5)ãã€ã³ããã¯ã¹6ã«ã!ããæ¿å ¥ããããããã¢ãªã¹ã¯OpAã倿ããå¿ èŠããããŸããäœçœ®5ãžã®æ¿å ¥ã¯ãä»ãäœçœ®5ã§è¡ãããã¹ãã§ãïŒããã®æ¿å ¥ã¯ã¢ãªã¹ãæå³ããæ¿å ¥ç¹ã®åŸãã®ã€ã³ããã¯ã¹6ã§ãã£ãããïŒã
- OpA' = insert(' ', 5)ãã¢ãªã¹ã¯OpA'ãé©çšããŸããããã¥ã¡ã³ãã¯ãHello !ãã«ãªããŸãã
ããåŽïŒ
- OpAãåä¿¡ïŒ insert(' ', 5)ãããã¥ã¡ã³ãã¯ãHello ãã«ãªããŸãã
- OpBãåä¿¡ïŒ insert('!', 6)ãããã¯OpAã«å¯ŸããŠOpBã倿ããå¿ èŠããããŸããã¢ãªã¹ãäœçœ®5ã«ã ããæ¿å ¥ããŸãããããã®äœçœ®6ãžã®æ¿å ¥ã¯ãä»ãäœçœ®6ã§è¡ãããã¹ãã§ãïŒã¢ãªã¹ã®æ¿å ¥ã¯ãããæå³ããæ¿å ¥ç¹ã®åãã®ã€ã³ããã¯ã¹5ã§ãã£ãããïŒã
- OpB' = insert('!', 6)ãããã¯OpB'ãé©çšããŸããããã¥ã¡ã³ãã¯ãHello !ãã«ãªããŸãã
ãã®ç°¡åãªã±ãŒã¹ã§ã¯ãäž¡æ¹ã®ãŠãŒã¶ãŒãåãç¶æ ãHello !ãã«å°éããŸãã倿颿°ã¯ãããŒã«ã«ã§ç°ãªãé åºã§é©çšãããå Žåã§ããåææäœãäžè²«ããã°ããŒãã«ãªç¶æ ã«ãªãããšãä¿èšŒããŸããã
ããã³ããšã³ãã§ã®ãªãã¬ãŒã·ã§ãã«ãã©ã³ã¹ãã©ãŒã¡ãŒã·ã§ã³ã®å®è£
ããã³ããšã³ãã§OTãå®è£ ããã«ã¯ãããã€ãã®äž»èŠãªã³ã³ããŒãã³ããšèæ ®äºé ãå«ãŸããŸããäžå¿çãªããžãã¯ã¯å€ãã®å ŽåãµãŒããŒãŸãã¯å°çšã®ã³ã©ãã¬ãŒã·ã§ã³ãµãŒãã¹ã«ååšããŸãããããã³ããšã³ãã¯æäœã®çæã倿ãããæäœã®é©çšãããã³ãªã¢ã«ã¿ã€ã ã®å€æŽãåæ ããããã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã®ç®¡çã«ãããŠéèŠãªåœ¹å²ãæãããŸãã
1. æäœã®è¡šçŸãšã·ãªã¢ã©ã€ãº
æäœã«ã¯ãæç¢ºã§ææ§ãã®ãªã衚çŸãå¿ èŠã§ããããã¹ãã®å Žåãããã«ã¯éåžžã以äžãå«ãŸããŸãã
- ã¿ã€ãïŒ 'insert' ãŸã㯠'delete'ã
- äœçœ®ïŒ æäœãè¡ãããã¹ãã€ã³ããã¯ã¹ã
- å å®¹ïŒæ¿å ¥ã®å ŽåïŒïŒ æ¿å ¥ãããæåã
- é·ãïŒåé€ã®å ŽåïŒïŒ åé€ããæåæ°ã
- ã¯ã©ã€ã¢ã³ãIDïŒ ç°ãªããŠãŒã¶ãŒããã®æäœãåºå¥ããããã
- ã·ãŒã±ã³ã¹çªå·/ã¿ã€ã ã¹ã¿ã³ãïŒ éšåçãªé åºã確ç«ããããã
ãããã®æäœã¯ãéåžžããããã¯ãŒã¯äŒéã®ããã«ïŒJSONãªã©ã䜿çšããŠïŒã·ãªã¢ã©ã€ãºãããŸãã
2. 倿ããžãã¯
ããã¯OTã®æãè€éãªéšåã§ããããã¹ãç·šéã®å Žåã倿颿°ã¯æ¿å ¥ãšåé€ã®éã®çžäºäœçšãåŠçããå¿ èŠããããŸããäžè¬çãªã¢ãããŒãã¯ãæ¿å ¥ãå¥ã®æ¿å ¥ãšã©ã®ããã«çžäºäœçšããããæ¿å ¥ãåé€ãšã©ã®ããã«çžäºäœçšããããåé€ãå¥ã®åé€ãšã©ã®ããã«çžäºäœçšããããå®çŸ©ããããšã§ãã
æ¿å ¥ïŒInsXïŒãšå¥ã®æ¿å ¥ïŒInsYïŒãšã®å€æãèããŠã¿ãŸãããã
- InsX.transform(InsY):
- InsXã®äœçœ®ãInsYã®äœçœ®ããå°ããå ŽåãInsXã®äœçœ®ã¯åœ±é¿ãåããŸããã
- InsXã®äœçœ®ãInsYã®äœçœ®ãã倧ããå ŽåãInsXã®äœçœ®ã¯InsYã®æ¿å ¥ãããå 容ã®é·ãã ãã€ã³ã¯ãªã¡ã³ããããŸãã
- InsXã®äœçœ®ãInsYã®äœçœ®ãšçããå Žåãé åºã¯ã©ã¡ãã®æäœãå ã«çæããããããŸãã¯ã¿ã€ãã¬ãŒã¯ã«ãŒã«ïŒäŸïŒã¯ã©ã€ã¢ã³ãIDïŒã«äŸåããŸããInsXãå ã®å Žåããã®äœçœ®ã¯åœ±é¿ãåããŸãããInsYãå ã®å ŽåãInsXã®äœçœ®ã¯ã€ã³ã¯ãªã¡ã³ããããŸãã
åæ§ã®ããžãã¯ãä»ã®æäœã®çµã¿åããã«ãé©çšãããŸãããããããã¹ãŠã®ãšããžã±ãŒã¹ã§æ£ããå®è£ ããããšã¯éåžžã«éèŠã§ãããå€ãã®å Žåãå³å¯ãªãã¹ããå¿ èŠã§ãã
3. ãµãŒããŒãµã€ã vs. ã¯ã©ã€ã¢ã³ããµã€ãOT
OTã¢ã«ãŽãªãºã ã¯å®å šã«ã¯ã©ã€ã¢ã³ãåŽã§å®è£ ããããšãã§ããŸãããäžè¬çãªãã¿ãŒã³ã§ã¯ãäžå€®ãµãŒããŒããã¡ã·ãªããŒã¿ãŒãšããŠæ©èœããŸãã
- éäžåOTïŒ åã¯ã©ã€ã¢ã³ãã¯æäœããµãŒããŒã«éä¿¡ããŸãããµãŒããŒã¯OTããžãã¯ãé©çšããåä¿¡ããæäœããã§ã«åŠçãŸãã¯ç¢ºèªããæäœã«å¯ŸããŠå€æããŸãããã®åŸããµãŒããŒã¯å€æãããæäœãä»ã®ãã¹ãŠã®ã¯ã©ã€ã¢ã³ãã«ãããŒããã£ã¹ãããŸããããã«ããã¯ã©ã€ã¢ã³ãã®ããžãã¯ã¯ç°¡çŽ åãããŸããããµãŒããŒãããã«ããã¯ããã³åäžé害ç¹ã«ãªããŸãã
- 忣å/ã¯ã©ã€ã¢ã³ããµã€ãOTïŒ åã¯ã©ã€ã¢ã³ãã¯èªèº«ã®ç¶æ ãç¶æããåä¿¡ããæäœãèªèº«ã®å±¥æŽã«å¯ŸããŠå€æããŠé©çšããŸããããã¯ç®¡çãããè€éã«ãªãå¯èœæ§ããããŸãããããé«ãå埩åãšã¹ã±ãŒã©ããªãã£ãæäŸããŸããShareDBã®ãããªã©ã€ãã©ãªãã«ã¹ã¿ã å®è£ ãããã容æã«ããããšãã§ããŸãã
ããã³ããšã³ãã®å®è£ ã§ã¯ãããã³ããšã³ããããŒã«ã«æäœãšãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã管çããããã¯ãšã³ããµãŒãã¹ãæäœã®å€æãšé ä¿¡ã調æŽãããã€ããªããã¢ãããŒãããã°ãã°äœ¿çšãããŸãã
4. ããã³ããšã³ããã¬ãŒã ã¯ãŒã¯ãšã®çµ±å
OTãReactãVueãAngularãªã©ã®ææ°ã®ããã³ããšã³ããã¬ãŒã ã¯ãŒã¯ã«çµ±åããã«ã¯ãæ éãªç¶æ 管çãå¿ èŠã§ãã倿ãããæäœãå°çãããšããããã³ããšã³ãã®ç¶æ ãããã«å¿ããŠæŽæ°ããå¿ èŠããããŸããããã«ã¯ãã°ãã°ä»¥äžãå«ãŸããŸãã
- ç¶æ 管çã©ã€ãã©ãªïŒ ReduxãZustandãVuexãNgRxãªã©ã®ããŒã«ã䜿çšããŠãå ±æããã¥ã¡ã³ããŸãã¯ããŒã¿ã衚ãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ã管çããŸãã
- ã€ãã¥ãŒã¿ãã«ãªããŒã¿æ§é ïŒ ã€ãã¥ãŒã¿ãã«ãªããŒã¿æ§é ãæ¡çšãããšãå倿Žãæ°ããç¶æ ãªããžã§ã¯ããçæãããããç¶æ ã®æŽæ°ãšãããã°ãç°¡çŽ åãããŸãã
- å¹ççãªUIæŽæ°ïŒ ç¹ã«å€§èŠæš¡ãªããã¥ã¡ã³ãã§é »ç¹ã«å°ããªå€æŽãæ±ãå Žåã«ãUIã®æŽæ°ãããã©ãŒãã³ã¹ãè¯ãããšãä¿èšŒããŸããä»®æ³ã¹ã¯ããŒã«ã差忀åºãªã©ã®æè¡ã䜿çšã§ããŸãã
5. æ¥ç¶åé¡ãžã®å¯ŸåŠ
ãªã¢ã«ã¿ã€ã ã³ã©ãã¬ãŒã·ã§ã³ã§ã¯ããããã¯ãŒã¯ã®åæãåæã¯äžè¬çã§ããOTã¯ãããã«å¯ŸããŠå ç¢ã§ããå¿ èŠããããŸãã
- ãªãã©ã€ã³ç·šéïŒ ã¯ã©ã€ã¢ã³ãã¯ãªãã©ã€ã³äžã§ãç·šéãç¶ç¶ã§ããã¹ãã§ãããªãã©ã€ã³ã§çæãããæäœã¯ããŒã«ã«ã«ä¿åããæ¥ç¶ãå埩ãããåæããå¿ èŠããããŸãã
- 調æŽïŒReconciliationïŒïŒ ã¯ã©ã€ã¢ã³ãã忥ç¶ãããšãããã®ããŒã«ã«ç¶æ ã¯ãµãŒããŒã®ç¶æ ããåå²ããŠããå¯èœæ§ããããŸããä¿çäžã®æäœãåé©çšããã¯ã©ã€ã¢ã³ãããªãã©ã€ã³äžã«çºçããæäœã«å¯ŸããŠå€æããããã®èª¿æŽããã»ã¹ãå¿ èŠã§ãã
- ç«¶å解決æŠç¥ïŒ OTã¯ç«¶åãé²ãããšãç®æããŸããããšããžã±ãŒã¹ãå®è£ ã®æ¬ é¥ãäŸç¶ãšããŠç«¶åãåŒãèµ·ããå¯èœæ§ããããŸããæç¢ºãªç«¶å解決æŠç¥ïŒäŸïŒæåŸã®æžã蟌ã¿ãåªå ãç¹å®ã®åºæºã«åºã¥ãããŒãžïŒãå®çŸ©ããããšãéèŠã§ãã
OTã®ä»£æ¿ãšè£å®ïŒCRDT
OTã¯æ°å幎ã«ããããªã¢ã«ã¿ã€ã ã³ã©ãã¬ãŒã·ã§ã³ã®åºç€ã§ããããç¹ã«éããã¹ãããŒã¿æ§é ãè€éãªã·ããªãªã§ã¯æ£ããå®è£ ããã®ãéåžžã«è€éã§ããããšãç¥ãããŠããŸãã代æ¿ãšããŠããŸããŸã人æ°ãé«ãŸã£ãŠããã¢ãããŒããConflict-free Replicated Data TypesïŒCRDTïŒã®äœ¿çšã§ãã
CRDTã¯ãè€éãªå€æé¢æ°ãå¿ èŠãšããã«çµææŽåæ§ãä¿èšŒããããã«èšèšãããããŒã¿æ§é ã§ããããã¯ãæäœã坿ã§ããããèªå·±ããŒãžå¯èœã§ããããšãä¿èšŒããç¹å®ã®æ°åŠçç¹æ§ãéããŠãããéæããŸãã
OTãšCRDTã®æ¯èŒ
ãªãã¬ãŒã·ã§ãã«ãã©ã³ã¹ãã©ãŒã¡ãŒã·ã§ã³ïŒOTïŒïŒ
- é·æïŒ æäœã«å¯Ÿãããã现ããå¶åŸ¡ãå¯èœã§ãç¹å®ã®ã¿ã€ãã®ããŒã¿ã«å¯ŸããŠããå¹ççã§ããå¯èœæ§ããããããã¹ãç·šéã§åºãçè§£ãããŠããŸãã
- çæïŒ ç¹ã«éããã¹ãããŒã¿ãè€éãªæäœã¿ã€ãã®å Žåãæ£ããå®è£ ããã®ãéåžžã«è€éã§ãã埮åŠãªãã°ãçºçããããã§ãã
Conflict-free Replicated Data TypesïŒCRDTïŒïŒ
- é·æïŒ å€ãã®ããŒã¿åã§å®è£ ãããç°¡åã§ãäžŠè¡æ§ããããã¯ãŒã¯ã®åé¡ãæ¬è³ªçã«ããåªé ã«åŠçãã忣ã¢ãŒããã¯ãã£ãããç°¡åã«ãµããŒãã§ããŸãã
- çæïŒ ç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã§ã¯å¹çãå£ãããšããããæ°åŠçãªåºç€ãæœè±¡çã§ããå¯èœæ§ããããäžéšã®CRDTå®è£ ã¯ããå€ãã®ã¡ã¢ãªã垯åå¹ ãå¿ èŠãšããå ŽåããããŸãã
å€ãã®çŸä»£çãªã¢ããªã±ãŒã·ã§ã³ãç¹ã«åçŽãªããã¹ãç·šéãè¶ ãããã®ã§ã¯ããã®çžå¯ŸçãªåçŽããšå ç¢æ§ã®ããã«CRDTã奜ãŸããéžæè¢ã«ãªãã€ã€ãããŸããYjsãAutomergeã®ãããªã©ã€ãã©ãªã¯ãããã³ããšã³ãã¢ããªã±ãŒã·ã§ã³ã«çµ±åã§ããå ç¢ãªCRDTå®è£ ãæäŸããŸãã
äž¡æ¹ã®èŠçŽ ãçµã¿åãããããšãå¯èœã§ããããšãã°ãã·ã¹ãã ã¯ããŒã¿è¡šçŸã«CRDTã䜿çšãã€ã€ãç¹å®ã®é«ã¬ãã«ãªæäœãUIã€ã³ã¿ã©ã¯ã·ã§ã³ã«ã¯OTã®ãããªæŠå¿µã掻çšãããããããŸããã
ã°ããŒãã«å±éã«ãããå®è·µçãªèæ ®äºé
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã«ãªã¢ã«ã¿ã€ã ã®å ±åäœæ¥æ©èœãæ§ç¯ããå Žåãã³ã¢ã¢ã«ãŽãªãºã 以å€ã®ããã€ãã®èŠå ãé¢ä¿ããŠããŸãã
- é å»¶ïŒLatencyïŒïŒ ç°ãªãå°ççãªå Žæã«ãããŠãŒã¶ãŒã¯ãããŸããŸãªçšåºŠã®é å»¶ãçµéšããŸããOTå®è£ ïŒãŸãã¯CRDTã®éžæïŒã¯ãé å»¶ã®ç¥èŠããã圱é¿ãæå°éã«æããã¹ãã§ãããªããã£ãã¹ãã£ãã¯æŽæ°ïŒæäœãå³åº§ã«é©çšããç«¶åããå Žåã¯å ã«æ»ãïŒã®ãããªæè¡ã圹ç«ã¡ãŸãã
- ã¿ã€ã ãŸãŒã³ãšåæïŒ OTã¯äž»ã«æäœã®é åºãæ±ããŸãããç£æ»ããããã°ã®ããã«ã¿ã€ã ã¹ã¿ã³ããã·ãŒã±ã³ã¹çªå·ãã¿ã€ã ãŸãŒã³éã§äžè²«æ§ã®ããæ¹æ³ïŒäŸïŒUTCã䜿çšïŒã§è¡šçŸããããšãéèŠã§ãã
- åœéåãšããŒã«ãªãŒãŒã·ã§ã³ïŒ ããã¹ãç·šéã®å Žåãæäœãç°ãªãæåã»ãããã¹ã¯ãªããïŒäŸïŒã¢ã©ãã¢èªãããã©ã€èªã®ãããªå³ããå·Šãžã®èšèªïŒãããã³ç §åã«ãŒã«ãæ£ããåŠçããããšã確èªããããšãéèŠã§ããOTã®äœçœ®ããŒã¹ã®æäœã¯ããã€ãã€ã³ããã¯ã¹ã ãã§ãªããæžèšçŽ ã¯ã©ã¹ã¿ãèªèããå¿ èŠããããŸãã
- ã¹ã±ãŒã©ããªãã£ïŒ ãŠãŒã¶ãŒããŒã¹ãæé·ããã«ã€ããŠããªã¢ã«ã¿ã€ã ã³ã©ãã¬ãŒã·ã§ã³ããµããŒãããããã¯ãšã³ãã€ã³ãã©ã¹ãã©ã¯ãã£ãã¹ã±ãŒã«ããå¿ èŠããããŸããããã«ã¯ã忣ããŒã¿ããŒã¹ãã¡ãã»ãŒãžãã¥ãŒãããã³ããŒããã©ã³ã·ã³ã°ãå«ãŸããå ŽåããããŸãã
- ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãã¶ã€ã³ïŒ å ±åç·šéã®ç¶æ³ããŠãŒã¶ãŒã«æç¢ºã«äŒããããšã¯äžå¯æ¬ ã§ãã誰ãç·šéããŠãããã倿Žããã€é©çšãããŠããããç«¶åãã©ã®ããã«è§£æ±ºããããã«ã€ããŠã®èŠèŠçãªæãããã¯ã䜿ãããããå€§å¹ ã«åäžãããããšãã§ããŸãã
ããŒã«ãšã©ã€ãã©ãª
OTãCRDTããŒãããå®è£ ããã®ã¯å€§å€ãªäœæ¥ã§ãã幞ããªããšã«ãéçºãå éã§ããããã€ãã®æçããã©ã€ãã©ãªããããŸãã
- ShareDBïŒ ãªãã¬ãŒã·ã§ãã«ãã©ã³ã¹ãã©ãŒã¡ãŒã·ã§ã³ã䜿çšãã人æ°ã®ãªãŒãã³ãœãŒã¹åæ£ããŒã¿ããŒã¹ããã³ãªã¢ã«ã¿ã€ã ã³ã©ãã¬ãŒã·ã§ã³ãšã³ãžã³ã§ããããŸããŸãªJavaScriptç°å¢åãã®ã¯ã©ã€ã¢ã³ãã©ã€ãã©ãªããããŸãã
- YjsïŒ éåžžã«ããã©ãŒãã³ã¹ãé«ãæè»ãªCRDTå®è£ ã§ãå¹ åºãããŒã¿åãšã³ã©ãã¬ãŒã·ã§ã³ã·ããªãªããµããŒãããŠããŸããããã³ããšã³ãçµ±åã«é©ããŠããŸãã
- AutomergeïŒ å ±åäœæ¥ã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ã容æã«ããããšã«çŠç¹ãåœãŠãããã1ã€ã®åŒ·åãªCRDTã©ã€ãã©ãªã§ãã
- ProseMirrorïŒ å ±åç·šéã®ããã«ãªãã¬ãŒã·ã§ãã«ãã©ã³ã¹ãã©ãŒã¡ãŒã·ã§ã³ã掻çšãããªããããã¹ããšãã£ã¿ãæ§ç¯ããããã®ããŒã«ãããã§ãã
- TiptapïŒ ProseMirrorãããŒã¹ã«ãããããã¬ã¹ãšãã£ã¿ãã¬ãŒã ã¯ãŒã¯ã§ããªã¢ã«ã¿ã€ã ã³ã©ãã¬ãŒã·ã§ã³ããµããŒãããŠããŸãã
ã©ã€ãã©ãªãéžæããéã«ã¯ããã®æç床ãã³ãã¥ããã£ãµããŒããããã¥ã¡ã³ããããã³ç¹å®ã®ãŠãŒã¹ã±ãŒã¹ãšããŒã¿æ§é ãžã®é©åæ§ãèæ ®ããŠãã ããã
çµè«
ããã³ããšã³ãã®ãªã¢ã«ã¿ã€ã ã³ã©ãã¬ãŒã·ã§ã³ã¯ãçŸä»£ã®Webéçºã«ãããŠè€éã§ããããããã®ããåéã§ãããªãã¬ãŒã·ã§ãã«ãã©ã³ã¹ãã©ãŒã¡ãŒã·ã§ã³ã¯ãå®è£ ãé£ããäžæ¹ã§ãè€æ°ã®åæãŠãŒã¶ãŒéã§ããŒã¿ã®äžè²«æ§ãä¿èšŒããããã®å ç¢ãªãã¬ãŒã ã¯ãŒã¯ãæäŸããŸããæäœå€æã®åºæ¬ååã倿颿°ã®æ éãªå®è£ ãããã³å ç¢ãªç¶æ 管çãçè§£ããããšã§ãéçºè ã¯é«åºŠã«ã€ã³ã¿ã©ã¯ãã£ãã§å ±åäœæ¥ãå¯èœãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã
æ°ãããããžã§ã¯ããããåçåãããã¢ãããŒããæ±ããå Žåã¯ãCRDTãæ€èšããããšã匷ããå§ãããŸããéžæããéçã«é¢ããããäžŠè¡æ§å¶åŸ¡ãšåæ£ã·ã¹ãã ã«é¢ããæ·±ãçè§£ãæãéèŠã§ããç®æšã¯ãäžçäžã®ãŠãŒã¶ãŒã«ã·ãŒã ã¬ã¹ã§çŽæçãªäœéšãåµé ããå ±æããžã¿ã«ç©ºéãéããŠçç£æ§ãšãšã³ã²ãŒãžã¡ã³ããä¿é²ããããšã§ãã
äž»èŠãªãã€ã³ãïŒ
- ãªã¢ã«ã¿ã€ã ã³ã©ãã¬ãŒã·ã§ã³ã«ã¯ãåææäœãåŠçããããŒã¿ã®äžè²«æ§ãç¶æããããã®å ç¢ãªã¡ã«ããºã ãå¿ èŠã§ãã
- ãªãã¬ãŒã·ã§ãã«ãã©ã³ã¹ãã©ãŒã¡ãŒã·ã§ã³ïŒOTïŒã¯ãæäœã倿ããŠåææ§ãä¿èšŒããããšã§ãããå®çŸããŸãã
- OTã®å®è£ ã«ã¯ãæäœã®å®çŸ©ã倿颿°ãããã³ã¯ã©ã€ã¢ã³ãéã§ã®ç¶æ 管çãå«ãŸããŸãã
- CRDTã¯OTã«ä»£ããçŸä»£çãªéžæè¢ã§ãããå€ãã®å Žåãããç°¡åãªå®è£ ãšé«ãå ç¢æ§ãåããŠããŸãã
- ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãé å»¶ãåœéåãããã³ã¹ã±ãŒã©ããªãã£ãèæ ®ããŠãã ããã
- ShareDBãYjsãAutomergeãªã©ã®æ¢åã®ã©ã€ãã©ãªã掻çšããŠéçºãå éãããŸãããã
å ±åäœæ¥ããŒã«ãžã®éèŠãé«ãŸãç¶ããäžããããã®æè¡ãç¿åŸããããšã¯ã次äžä»£ã®ã€ã³ã¿ã©ã¯ãã£ããªWebäœéšãæ§ç¯ããããã«äžå¯æ¬ ãšãªãã§ãããã